﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
using IbsysII.Domain;
using System.Windows;

namespace IbsysII.Service
{
    class OutputXml
    {
        public static int dateienIndex()
        {
            int index = 1;
            List<string> dateiNamen = new List<string>();
            try
            {
                string[] dateien = System.IO.Directory.GetFiles(@"..\..\Daten");
                foreach (var datei in dateien)
                {
                    dateiNamen.Add(datei.Substring(12, datei.Length - 12));
                }
                dateiNamen.Sort();
                string letzteDatei = dateiNamen.Last();
                letzteDatei = letzteDatei.Substring(11, letzteDatei.Length - 11 - 4);
                index = Convert.ToInt32(letzteDatei) + 1;
            }
            catch (Exception)
            {

            }
            return index;
        }

        /// <summary>
        /// ist die ausgewaehlte XML Datei entsprechend der XSD definiert
        /// </summary>
        /// <param name="sxml">ausgewaehlte XML</param>
        /// <returns>valide?</returns>
        public static bool validate(string sxml)
        {
            string projectPath = Environment.CurrentDirectory;
            //Für Setup auskoomentieren
            for (int i = 0; i < 2; i++)
            {
                projectPath = System.IO.Path.GetDirectoryName(projectPath);
            }
            projectPath = projectPath + @"\Daten\XMLSchemaInput.xsd";
            bool isValid = true;
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Schemas.Add(null, projectPath);
            settings.ValidationType = ValidationType.Schema;
            XmlDocument document = new XmlDocument();
            document.Load(@sxml);
            XmlReader rdr = XmlReader.Create(new StringReader(document.InnerXml), settings);
            try
            {   
                while (rdr.Read())
                {}
            }
            catch (Exception es)
            {
                MessageBox.Show(es.Message);
                isValid = false;
            }
            return isValid;
        }

        public static void generateOutputXml(string pPath)
        {
            using (XmlWriter xmlWriter = XmlWriter.Create(@pPath))
            {
                xmlWriter.WriteStartDocument();
                xmlWriter.WriteStartElement("input");

                xmlWriter.WriteStartElement("qualitycontrol");
                xmlWriter.WriteAttributeString("type", "no");
                xmlWriter.WriteAttributeString("losequantity", "0");
                xmlWriter.WriteAttributeString("delay", "0");
                xmlWriter.WriteEndElement();

                //schreibe sellwish Knoten
                xmlWriter.WriteStartElement("sellwish");
                foreach(Teil t in App.vertrieb)
                {
                    xmlWriter.WriteStartElement("item");
                    xmlWriter.WriteAttributeString("article", t.TeilNr.ToString());
                    xmlWriter.WriteAttributeString("quantity",t.Bedarf.ToString());
                    xmlWriter.WriteEndElement();
                }
               
                xmlWriter.WriteEndElement();

                //schreibe selldirect Knoten
                xmlWriter.WriteStartElement("selldirect");
                if (App.direktVertrieb.Count != 0)
                {
                    foreach (Teil t in App.direktVertrieb)
                    {
                        xmlWriter.WriteStartElement("item");
                        xmlWriter.WriteAttributeString("article", t.TeilNr.ToString());
                        xmlWriter.WriteAttributeString("quantity", t.MengeDirekt.ToString());
                        xmlWriter.WriteAttributeString("price", t.PreisDirekt.ToString());
                        xmlWriter.WriteAttributeString("penalty", t.KoventDirekt.ToString());
                        xmlWriter.WriteEndElement();
                    }
                }
                else
                {
                    foreach (Teil t in App.vertrieb)
                    {
                        xmlWriter.WriteStartElement("item");
                        xmlWriter.WriteAttributeString("article", t.TeilNr.ToString());
                        xmlWriter.WriteAttributeString("quantity", "0");
                        xmlWriter.WriteAttributeString("price", "0.0");
                        xmlWriter.WriteAttributeString("penalty", "0.0");
                        xmlWriter.WriteEndElement();
                    }

                }
                
                xmlWriter.WriteEndElement();

                //schreibe orderlist Knoten
                xmlWriter.WriteStartElement("orderlist");
                foreach (var bestellung in App.lstBestellungen.Bestellpositionen)
                {
                    xmlWriter.WriteStartElement("order");
                    xmlWriter.WriteAttributeString("article", bestellung.TeileNr.ToString());
                    xmlWriter.WriteAttributeString("quantity", bestellung.Menge.ToString());
                    xmlWriter.WriteAttributeString("modus", bestellung.Modus.ToString());
                    xmlWriter.WriteEndElement();   
                }
                xmlWriter.WriteEndElement();

                //schreibe productionlist Knoten
                xmlWriter.WriteStartElement("productionlist");
                List<Produktionsauftrag> prodAuftragOrd = App.lstProgP1.Concat(App.lstProgP2).Concat(App.lstProgP3).OrderByDescending(t => t.Prio).ToList();
                foreach (Produktionsauftrag p in prodAuftragOrd)
                {
                    if ((p.Teil.Teileart.CompareTo('P') == 0 || p.Teil.Teileart.CompareTo('E') == 0) && p.Teil.Bedarf != 0)
                    {
                        xmlWriter.WriteStartElement("production");
                        xmlWriter.WriteAttributeString("article", p.Teil.TeilNr.ToString());
                        xmlWriter.WriteAttributeString("quantity",p.Teil.Bedarf.ToString());
                        xmlWriter.WriteEndElement();
                    }
                    
                }
                /*
                foreach (Produktionsauftrag p in App.lstProgP2)
                {
                    if ((p.Teil.Teileart.CompareTo('P') == 0 || p.Teil.Teileart.CompareTo('E') == 0) && p.Teil.Bedarf!=0)
                    {
                        xmlWriter.WriteStartElement("production");
                        xmlWriter.WriteAttributeString("article", "" + p.Teil.TeilNr);
                        xmlWriter.WriteAttributeString("quantity", "" + p.Teil.Bedarf);
                        xmlWriter.WriteEndElement();
                    }
                }
                foreach (Produktionsauftrag p in App.lstProgP3)
                {
                    if ((p.Teil.Teileart.CompareTo('P') == 0 || p.Teil.Teileart.CompareTo('E') == 0) && p.Teil.Bedarf != 0)
                    {
                        xmlWriter.WriteStartElement("production");
                        xmlWriter.WriteAttributeString("article", "" + p.Teil.TeilNr);
                        xmlWriter.WriteAttributeString("quantity", "" + p.Teil.Bedarf);
                        xmlWriter.WriteEndElement();
                    }
                }
                 */
               
                xmlWriter.WriteEndElement();

                //schreibe workingtimelist Knoten
                xmlWriter.WriteStartElement("workingtimelist");
                foreach (var item in Zeitverwaltung.dicZeitverwaltung)
                {
                    if (item.Key != 5)
                    {
                        xmlWriter.WriteStartElement("workingtime");
                        xmlWriter.WriteAttributeString("station", item.Key.ToString());
                        xmlWriter.WriteAttributeString("shift", item.Value.Schicht);
                        xmlWriter.WriteAttributeString("overtime", (item.Value.Ueberminuten/5).ToString());
                        xmlWriter.WriteEndElement();
                    }
                }
                xmlWriter.WriteEndElement();

                xmlWriter.WriteEndDocument();
            }
        }
    }
}